home *** CD-ROM | disk | FTP | other *** search
/ Die Ultimative Software-P…i Collection 1996 & 1997 / Die Ultimative Software-Pakete CD-ROM fur Atari Collection 1996 & 1997.iso / a / a_funk / packet1.tos / INGOCOM / INGOCOM.SOU < prev    next >
Encoding:
Text File  |  1995-04-30  |  45.7 KB  |  1,329 lines

  1. 16Aug93/0426 Subject: re: tfstx/ingocom Bulletin ID: 12830IDL8HBS
  2. Path: DB0RBS!DB0MWE!DB0KCP!HB9OS!HB9EAS!DB0GE!DB0HOM!DB0AIS!DB0SIF!DB0EAM
  3. !DK0MAV!DB0DNI!DK0MNL!DL8HBS de DL8HBS   @ DL8HBS to ATARI    @ ALLE
  4. Guten Tag,
  5. alle wollen TFSTX, keiner schreibt es...
  6.  
  7. Ich spiele im nachfolgenden  7PLUS-LZH-Archiv  die Original-Assembler
  8. - Sourcen zum dekodieren  eines  Modems  am  RI-Eingang der seriellen
  9. Schnittstelle des ST ein.  Die  Source  ist vom INGOCOM-Autor DH5MBC,
  10. ich weiss leider nicht, wie  ich  ihn  erreichen kann, nehme aber an,
  11. dass er mit ........ sind  mir noch einige
  12. Fehler unterlaufen, deswegen läuft es noch nicht so, wie es soll.
  13.  
  14. Ich habe keine  Zeit  und  auch  keine  Veranlassung,  die  Fehler zu
  15. finden.  Ich  musste  meinen  TNC  am  Modem  anzapfen,  um  an   die
  16. benötigten Signale  zu  kommen,  also  was  soll der Aufwand für mich
  17. hi.
  18.  
  19. Sollte sich jemand die  Mühe  machen,  die  von mir optimierte Source
  20. fehlerzubereinigen,  so  werde  ich  Mittel  und  Wege finden, das an
  21. einen residenten TF2.6-Treiber anzubinden.
  22.  
  23. Die Sourcen sind  nur  zur  nichtkommerziellen  Verwendung  frei, die
  24. Arbeitsergebnisse  müssen!  wiederum  der Allgemeinheit zur Verfügung
  25. gestellt werden.
  26. Wer sich nicht daran hält kriegt Ärger!
  27. Gruss, Joachim
  28. DL8HBS @ DB0GR
  29. P.S.:  Wollen  wir  doch  mal  sehen,  ob  noch  jemand  für  den  ST
  30. programmiert, wie gesagt, prinzipiell gehen tut es.
  31.  
  32. ; Dies ist die Originalsource zum Emfang von INGOCOM von DH5MBC
  33. ; Eine kommerzielle Verwertung ist untersagt, die verbesserten
  34. ; Sourcen sind der Allgemeinheit zur Verfüfgung zu stellen!
  35. ; Die Einspielung erfolgt von DL8HBS, ich nehme an, DH5MBC ist
  36. ; damit einverstanden. Ich weiss nicht, wie ich ihn erreichen sollte.
  37.  
  38.           .GLOBL Empfang,restore,stazei,timer_ve,timerdat1,tim_dcont,taste
  39.           .GLOBL scroll,Spuriosinterrupt
  40.  
  41. inter_mask_reg      equ $fffa15
  42. int_enable_reg      equ $fffa06
  43. int_serv_reg_a      equ $fffa0e
  44. int_serv_reg_b      equ $fffa10
  45. aktive_edge_reg     equ $fffa03
  46. timerdat            equ $fffa1e
  47. timercont           equ $fffa18
  48. serialport          equ $fffa00
  49. vblsem              equ $00000452
  50. keyvec              equ $00118
  51. rivec               equ $00138
  52. timer_a_vec         equ $00134
  53. spurios_vec         equ $00060
  54.  
  55. Empfang:  move.l    a0,sichadr          ;a0 = anfang empfangsspeicher
  56.           addq.l    #2,a0               ;erste 2 bytes fuer zahl der empf.
  57.           move.l    a0,adresse          ;byte reserviert
  58.  
  59.           movem.l   d0-d7/a0-a6,-(sp)   ;register sichern
  60.  
  61.           move.w    #255,timerdat1      ;timer auf 1200 baud
  62.           move.w    #5,tim_dcont
  63.  
  64.           pea       0                   ;supervisor
  65.           move.w    #$20,-(sp)
  66.           trap      #1
  67.           addq.l    #6,sp
  68.  
  69.           move.l    d0,savestack        ;stackpointer retten
  70.             
  71.           lea       Neutast,a4          ;tastaurinterrupt
  72.           move.l    keyvec,a3           ;XBRA
  73.           move.l    a3,-4(a4)
  74.  
  75.           pea       Neutast 
  76.           move.w    #06,-(sp)
  77.           move.w    #$d,-(sp)           ;neuen interruptvector Tastint                                      
  78.           trap      #14                 ; übergeben
  79.           addq.l    #8,sp
  80.           
  81.           lea.l     Start,a4            ;XBRA ri
  82.           move.l    rivec,a3
  83.           move.l    a3,-4(a4)
  84.  
  85.           pea       Start(pc)           ;interruptvector übergeben
  86.           move.w    #14,-(sp)
  87.           move.w    #$d,-(sp)
  88.           trap      #14
  89.           addq.l    #8,sp
  90.  
  91.           move.w    #14,-(sp)           ;ri interrupt noch sperren
  92.           move.w    #$1a,-(sp)
  93.           trap      #14
  94.           addq.l    #4,sp
  95.           
  96.           lea       Timerinterr,a4
  97.           move.l    a4,timer_ve
  98.                                         ;XBRA timerint
  99.           movea.l   timer_a_vec,a3
  100.           move.l    a3,-4(a4)
  101.  
  102.           pea       Timerinterr         ;timer setzen
  103.           move.w    #255,-(sp)          ;1200  baud
  104.           move.w    #0,-(sp)            ;noch nicht starten
  105.           move.w    #0,-(sp)            ;timer A
  106.           move.w    #$1f,-(sp)
  107.           trap      #14
  108.           lea.l     $c(sp),sp
  109.  
  110.           lea       Spuriosinterr,a4    ;spurios interrupt verbiegen
  111.           movea.l   spurios_vec,a3
  112.           move.l    a3,-4(a4)
  113.           move.l    a4,spurios_vec          
  114.  
  115.           move.l    savestack,-(sp)     ;supervisor aus
  116.           move.w    #$20,-(sp)
  117.           trap      #1
  118.           addq.l    #6,sp
  119.  
  120.           move.w    #15,vergleichwert   ;anfangsparmeter setzen
  121.           move.w    #32,bitwert
  122.           move.w    #208,synchwert
  123.           move.w    #0,ri_flag
  124.           move.w    #0,synch_flag
  125.  
  126.           movem.l   (sp)+,d0-d7/a0-a6   ;register restaurieren
  127.           move.l    #byteflag,d0
  128.           movea.l   d0,a0               ;rueckgabe ist adresse und turbo-c will
  129.           rts                           ;das in a0
  130.    
  131.            .EVEN 
  132.  
  133. XBRAta:   .DC.b 'X','B','R','A'
  134.           .DC.b 'D','C','S','T'
  135.           .DC.l 0
  136. Neutast:
  137.           move.l    a0,a0sich       ;register A0 sichern
  138.           ori.w     #$0700,sr       ;interruptlevel auf 5 setzen
  139.           andi.w    #$f5ff,sr       ;somit ri_interrupt waehrend
  140.                                     ;tastaturinterrupt moeglich
  141.     
  142.           lea       Neutast,a0      ;normale Tastaturinterruptroutine
  143.           move.l    -4(a0),-(sp)    ;anspringen
  144.           move.l    a0sich,a0
  145.           rts
  146.           
  147. a0sich: dc.l 0
  148.  
  149.           .EVEN
  150. XBRAri:   .DC.b 'X','B','R','A'
  151.           .DC.b 'D','C','S','T'
  152.           .DC.l 0
  153.  
  154. Start:    
  155.           movem.l   d0-d7/a0-a6,-(sp)   ;register sichern           
  156.           move.w    #0,vblsem         
  157.           bsr       ri_int
  158.           
  159.             
  160.           movem.l   (sp)+,d0-d7/a0-a6   ;register herstellen
  161.  
  162.           move.w    #191,int_serv_reg_a ;interrupt in service loeschen
  163.           ori.w     #96,int_enable_reg  ;ri und timer int freigeben
  164.  
  165.           rte       
  166.  
  167. ri_int:   
  168.  
  169.           andi.w    #159,int_enable_reg ;timer  und ri interrupt sperren
  170.           bchg      #6,aktive_edge_reg  ;naechster interrupt bei anderer flanke
  171.  
  172.           move.l    #255,d0             ;d0 = 255 - timerdat
  173.           sub.b     $fffa1f,d0          ;entspricht timerschritte seit letztem interrupt
  174.  
  175.           move.w    #0,d4
  176.           move.w    bytecount,d5
  177.           move.l    adresse,a3
  178.           cmpi.w    #0,ri_flag
  179.           bne       kein_sta_zei
  180.           move.w    #-1,status
  181.  
  182. kein_sta_zei:       
  183.           move.w    #-1,ri_flag
  184.  
  185.           move.w    #0,timercont        ;timer neu
  186.           move.w    timerdat1,timerdat  ;starten
  187.           move.w    tim_dcont,timercont
  188.           ori.w     #32,int_enable_reg
  189.           move.w    #223,int_serv_reg_a
  190.  
  191. kein_rueck:         
  192.           move.w    vorher,d3
  193.           move.w    d0,vorher
  194.  
  195.           cmpi.w    #0,synch_flag       ;wenn synchronisation noch nicht
  196.           beq       loop                ;erfolgte ist kein stuffing möglich
  197.  
  198.           cmpi.w    #0,d5        ;sind bereits bytes empfangen worden
  199.           bne       evtl_endsynch       ;muss ein impuls > 7*32-16 ein endsynch sein
  200.  
  201.           cmp.w     synchwert,d0
  202.           bge       ri_ruecksprung
  203.           cmp.w     synchwert,d3
  204.           bge       ri_ruecksprung
  205.           bra       kein_7E
  206.  
  207. evtl_endsynch:      
  208.           cmp.w     synchwert,d3
  209.           bge       frame_end
  210.  
  211.  
  212. kein_7E:  
  213.           move.w    d3,d0
  214. loop:     
  215.           move.w    byte,d1             ;bis jetzt empf byte nach d1
  216.           sub.w     bitwert,d0          ;timerschritte minus bitwert
  217.  
  218.           cmp.w     vergleichwert,d0    ;wenn rest > 16
  219.           ble       null_setzten
  220.  
  221.           bset      #7,d1               ;war empf bit eine 1
  222.           addq.w    #1,d4
  223.           bra       vergleich
  224.  
  225. null_setzten:                           ;sonst war es eine null
  226.           bclr      #7,d1
  227.           cmpi.w    #5,d4
  228.           bne       mach_null
  229.           move.w    #0,d4
  230.           bra       nix_schiebens
  231.  
  232. mach_null:          
  233.           move.w    #0,d4
  234. vergleich:          
  235.  
  236.           cmpi.w    #0,synch_flag       ;wenn synchbyte schon empf
  237.           bne       aufnahme            ;dann springe zu aufnahme
  238.  
  239.           cmpi.w    #$7e,d1             ;wenn byte in d1 = 7e = synchronbyte
  240.           bne       schieben
  241.  
  242.           move.w    #0,bitcount
  243.           move.w    #0,byte
  244.           move.w    #0,d4
  245.           move.w    #$ff,synch_flag     ;synchronflag setzten
  246.  
  247.           bra       nix_schiebens
  248.  
  249. aufnahme: 
  250.           cmpi.w    #7,bitcount
  251.           bne       schieben
  252.  
  253.           move.b    d1,(a3)+ ;byte in adresse schreiben
  254.                               ;und adresse um eins erhöhen
  255.           
  256.           move.w    #0,bitcount         ;bitcount =0
  257.           move.w    #0,byte
  258.           addq.w    #1,d5
  259.  
  260.           bra       nix_schiebens
  261.  
  262. schieben: 
  263.           lsr.b     #1,d1               ;byte um 1 stelle nach rechts schiebne
  264.           move.w    d1,byte
  265.           addq.w    #1,bitcount
  266.  
  267. nix_schiebens:      
  268.  
  269.           cmp.w     vergleichwert,d0    ;wenn wert in d0 >16
  270.           ble       ri_ruecksprung
  271.           bra       loop                ;dann zu neuem durchlauf
  272.  
  273. ri_ruecksprung:     
  274.           move.w    d5,bytecount
  275.           move.l    a3,adresse
  276.           rts                           ;ruecksprung
  277.  
  278.           .EVEN 
  279.  
  280. frame_end:          
  281.  
  282.           movea.l   sichadr,a0
  283.           move.w    d5,d3        ;anzahl der empfangenen bytes sichern
  284.           move.b    d3,(a0)+
  285.           lsr.w     #8,d3
  286.           move.b    d3,(a0)
  287.           move.w    #0,d5        ;bytecount =0
  288.           move.l    a3,sichadr
  289.           addq.l    #2,a3
  290.           move.l    a3,adresse
  291.           move.w    #0,bitcount
  292.           move.w    #0,synch_flag
  293.           bra       ri_ruecksprung
  294.  
  295. XBRAti:   .DC.b 'X','B','R','A'
  296.           .DC.b 'D','C','S','T'
  297.           .DC.l 0
  298.  
  299.  
  300. Timerinterr:        
  301.           
  302.           movem.l   d0-d7/a0-a6,-(sp)   ;register sichern
  303.           bsr       ri_int
  304. ausis:    
  305.           move.w    #0,bytecount        ;parameter reseten
  306.           move.w    #0,ri_flag
  307.           move.w    #-1,status
  308.           move.w    #1,vblsem
  309.  
  310.           move.w    #0,synch_flag
  311.           move.l    sichadr,a3
  312.           addq.l    #2,a3
  313.           move.l    a3,adresse
  314.  
  315.           move.w    #0,timercont        ;timer neu
  316.           move.w    timerdat1,timerdat  ;einstellen
  317.  
  318.           movem.l   (sp)+,d0-d7/a0-a6   ;register herstellen
  319.           move.w    #159,int_serv_reg_a ;timer u ri interrupt ist beendet
  320.           ori.w     #96,int_enable_reg  ;timer u. ri int freigeben
  321.           
  322.           rte       
  323.  
  324. restore:  
  325.           movem.l   d0-d7/a0-a6,-(sp)   ;register sichern
  326.           pea       0                   ;supervisor
  327.           move.w    #$20,-(sp)
  328.           trap      #1
  329.           addq.l    #6,sp
  330.  
  331.           lea.l     Start,a0            ;ri zeiger zuruecksetzen
  332.           move.l    -4(a0),rivec
  333.  
  334.           lea.l     Timerinterr,a0      ;ti zeiger zuruecksetzen
  335.           move.l    -4(a0),timer_a_vec
  336.  
  337.           lea.l     Spuriosinterr,a0      ;sp_int zeiger zuruecksetzen
  338.           move.l    -4(a0),spurios_vec
  339.  
  340.           lea.l     Neutast,a0          ;tastatur zeiger zuruecksetzen
  341.           move.l    -4(a0),keyvec
  342.  
  343.           move.l    savestack,-(sp)     ;supervisor aus
  344.           move.w    #$20,-(sp)
  345.           trap      #1
  346.           addq.l    #6,sp
  347.  
  348.           movem.l   (sp)+,d0-d7/a0-a6   ;register herstellen
  349.           
  350.           rts       
  351.  
  352.           .EVEN
  353.  
  354. XBRAsp:   .DC.b 'X','B','R','A'
  355.           .DC.b 'D','C','S','T'
  356.           .DC.l 0
  357.           
  358. Spuriosinterr:
  359.           bra Timerinterr
  360.  
  361. scroll:
  362.           cmpi.w    #0,d0
  363.           beq       scrollret
  364.           move.l    a0,a1
  365.           add.l     #84,a1
  366. scrolloop:
  367.           move.l    (a1)+,(a0)+
  368.           dbf       d0,scrolloop
  369. scrollret:
  370.           rts
  371.           
  372.           
  373. savestack:          .DC.l 0
  374. byteflag: .DC.w 0
  375. bytecount:          .DC.w 0
  376. adresse:  .DC.l 0
  377. sichadr:  .DC.l 0
  378. timerdat1:          .DC.w 0
  379. tim_dcont:          .DC.w 0
  380. vergleichwert:      .DC.w 0
  381. synch_flag:         .DC.w 0
  382. ri_flag:  .DC.w 0
  383. synchwert:          .DC.w 0
  384. bitwert:  .DC.w 0
  385. bitcount: .DC.w 0
  386. status:   .DC.w 0
  387. byte:     .DC.w 0
  388. vorher:   .DC.w 0
  389. timer_ve: .DC.l 0
  390. oldkey:   .DC.l 0
  391.  
  392.  
  393.  
  394.           .EVEN 
  395.  
  396. * Dies ist eine bereits hochoptimierte Version von DH5MBC's Sourcen,
  397. * die Optimierungen sind von DL8HBS. Leider sind sie noch nicht ganz
  398. * fehlerfrei.
  399. * Ich würde diese Version überarbeiten und insbesondere die Variablen-
  400. * zugriffe nocheinmal genauestens überprüfen sowie die Verwendung von
  401. * Byte-Zugriffen auf die I/O-Adressen anstelle der originalen Word-
  402. * Zugriffe. Mit geladenem HSMODEM sollte die Interruptbearbeitung
  403. * dieser Version so schnell sein, dass sich Maus, Tastatur und
  404. * serielle Schnittstelle nicht gegenseitig aus'interrupten'.
  405. * Jegliche kommerzielle Verwertung ist untersagt, hieraus hervorge-
  406. * gangene verbesserte Sourcen MÜSSEN der Allgemeinheit zur Verfügung
  407. * gestellt werden.
  408. * Joachim Schurig, DL8HBS, 12/08/93
  409.  
  410.             .GLOBL AX_RX_ON,AX_RX_OFF   ; Empfang, restore ...
  411.  
  412. *          .XDEF stazei,timer_ve,timerd1,tim_dcont,taste
  413. *          .GLOBL scroll,Spuriosinterr
  414.  
  415. inter_mask_reg      equ $00fffa15
  416. int_enable_reg      equ $00fffa07
  417. int_serv_reg_a      equ $00fffa0f
  418. aktive_edge_reg     equ $00fffa03
  419. timerdat            equ $00fffa1f
  420. timercont           equ $00fffa19
  421. vblsem              equ $00000452
  422. keyvec              equ $00118
  423. rivec               equ $00138
  424. timer_a_vec         equ $00134
  425. spurios_vec         equ $00060
  426.  
  427.  
  428.             .text
  429.  
  430. * function AX_RX_ON(adresse:long_integer):long_integer; external;
  431.  
  432. AX_RX_ON: move.l    4(sp),d0                ;ADRESSE nach d0
  433.  
  434.           movem.l   d0-d7/a0-a6,-(sp)       ;register sichern
  435.  
  436.           lea       parms,a4
  437.           move.l    a4,a2
  438.           move.w    #(lastparm-parms)/2,d1
  439. clr_lp:   clr.w     (a2)+
  440.           dbra      d1,clr_lp
  441.  
  442.           move.l    d0,sichadr-parms(a4)    ;d0 = anfang empfangsspeicher
  443.           addq.l    #2,d0                   ;erste 2 bytes fuer zahl der empf.
  444.           move.l    d0,adresse-parms(a4)    ;byte reserviert
  445.  
  446.           move.w    #255,timerd1-parms(a4)  ;timer auf 1200 baud
  447.           move.w    #5,tim_dcont-parms(a4)
  448.  
  449.           clr.l     -(sp)                   ;supervisor
  450.           move.w    #$20,-(sp)
  451.           trap      #1
  452.           addq.l    #6,sp
  453.  
  454.           move.l    d0,savestack-parms(a4)  ;stackpointer retten
  455.             
  456.           lea       Neutast(pc),a4          ;tastaurinterrupt
  457.           move.l    keyvec,a3               ;XBRA
  458.           move.l    a3,-4(a4)
  459.  
  460.           move.l    a4,-(sp)
  461.           move.w    #06,-(sp)
  462.           move.w    #$d,-(sp)               ;neuen interruptvector Tastint                                      
  463.           trap      #14                     ;übergeben
  464.           addq.l    #8,sp
  465.           
  466.           lea       Start(pc),a4            ;XBRA ri
  467.           move.l    rivec,a3
  468.           move.l    a3,-4(a4)
  469.  
  470.           move.l    a4,-(sp)
  471.           move.w    #14,-(sp)
  472.           move.w    #$d,-(sp)
  473.           trap      #14
  474.           addq.l    #8,sp
  475.  
  476.           move.w    #14,-(sp)               ;ri interrupt noch sperren
  477.           move.w    #$1a,-(sp)
  478.           trap      #14
  479.           addq.l    #4,sp
  480.           
  481.           lea       TimerAint(pc),a4
  482.           move.l    a4,timer_ve
  483.           movea.l   timer_a_vec,a3
  484.           move.l    a3,-4(a4)
  485.           move.l    a4,-(sp)
  486.           move.w    #255,-(sp)              ;1200  baud
  487.           move.w    #0,-(sp)                ;noch nicht starten
  488.           move.w    #0,-(sp)                ;timer A
  489.           move.w    #$1f,-(sp)
  490.           trap      #14
  491.           lea.l     $c(sp),sp
  492.  
  493.           lea       Spuriosinterr(pc),a4    ;spurios interrupt verbiegen
  494.           movea.l   spurios_vec,a3
  495.           move.l    a3,-4(a4)
  496.           move.l    a4,spurios_vec
  497.  
  498.           move.l    savestack,-(sp)         ;supervisor aus
  499.           move.w    #$20,-(sp)
  500.           trap      #1
  501.           addq.l    #6,sp
  502.  
  503.           move.w    #15,vglwert-parms(a4)   ;anfangsparmeter setzen
  504.           move.w    #32,bitwert-parms(a4)
  505.           move.w    #208,synchwert-parms(a4)
  506.           clr.w     ri_flag-parms(a4)
  507.           clr.w     synch_flag-parms(a4)
  508.  
  509.           movem.l   (sp)+,d0-d7/a0-a6       ;register restaurieren
  510.           move.l    #byteflag,d0
  511.  
  512. *          movea.l   d0,a0                  ;rueckgabe ist adresse und turbo-c will
  513. *          rts                              ;das in a0
  514.  
  515. * Nun, so sieht das in Pascal aus:
  516.           move.l    (sp)+,a0
  517.           addq.l    #4,sp
  518.           jmp       (a0)
  519.    
  520. * procedure AX_RX_OFF;external;
  521.  
  522. AX_RX_OFF:
  523.           movem.l   d0-d7/a0-a6,-(sp)   ;register sichern
  524.           clr.l     -(sp)               ;supervisor
  525.           move.w    #$20,-(sp)
  526.           trap      #1
  527.           addq.l    #6,sp
  528.  
  529.           lea       Start(pc),a0        ;ri zeiger zuruecksetzen
  530.           move.l    -4(a0),rivec
  531.  
  532.           lea       TimerAint(pc),a0    ;ti zeiger zuruecksetzen
  533.           move.l    -4(a0),timer_a_vec
  534.  
  535.           lea.l     Spuriosinterr(pc),a0 ;sp_int zeiger zuruecksetzen
  536.           move.l    -4(a0),spurios_vec
  537.  
  538.           lea.l     Neutast(pc),a0      ;tastatur zeiger zuruecksetzen
  539.           move.l    -4(a0),keyvec
  540.  
  541.           move.l    savestack,-(sp)     ;supervisor aus
  542.           move.w    #$20,-(sp)
  543.           trap      #1
  544.           addq.l    #6,sp
  545.  
  546.           movem.l   (sp)+,d0-d7/a0-a6   ;register herstellen
  547.           rts
  548.  
  549. * scroll:
  550. *         tst.w     d0
  551. *         beq.s     scrollret
  552. *         move.l    a0,a1
  553. *         add.l     #84,a1
  554. * scrolloop:
  555. *         move.l    (a1)+,(a0)+
  556. *         dbf       d0,scrolloop
  557. * scrollret:
  558. *         rts
  559.  
  560. XBRAta:   .dc.b 'XBRA'
  561.           .dc.b 'DCST'
  562.           .dc.l 0
  563.  
  564. Neutast:  ori.w     #$0700,sr           ;interruptlevel auf 5 setzen
  565.           andi.w    #$f5ff,sr           ;somit ri_interrupt waehrend
  566.           move.l    Neutast-4(pc),-(sp) ;tastaturinterrupt moeglich
  567.           rts
  568.  
  569.           .dc.b 'XBRA'
  570.           .dc.b 'DCST'
  571.           .dc.l 0
  572.  
  573. Spuriosinterr:
  574.           bra.s TimerAint
  575.  
  576.           .dc.b 'XBRA'
  577.           .dc.b 'DCST'
  578.           .dc.l 0
  579.  
  580. TimerAint:                                  * Timer A ist abgelaufen...
  581.           movem.l   d0-d5/a0-a4,-(sp)       ;register sichern
  582.           bsr.s     ri_int                  ;a4 wird in ri_int geladen
  583.           clr.w     -(a2)                   ;(bytecount)
  584.           addq.l    #2,a1                   ;a1 = ^sichadr;
  585.           move.l    (a1)+,d2                ;(sichadr)
  586.           addq.l    #2,d2
  587.           move.l    d2,(a2)+                ;(adresse)
  588.           clr.w     (a2)+                   ;(ri_flag)
  589.           move.w    #-1,(a1)                ;(status)
  590.           move.w    #1,vblsem
  591.           clr.w     synch_flag-parms(a4)
  592.           clr.w     timercont               ;timer neu
  593.           addq.l    #1,a2
  594.           move.b    (a2)+,timerdat          ;(timerd1) einstellen
  595.           movem.l   (sp)+,d0-d5/a0-a4       ;register herstellen
  596.           move.b    #159,int_serv_reg_a     ;timer u. ri interrupt ist beendet
  597.           ori.b     #96,int_enable_reg      ;timer u. ri int freigeben
  598.           rte       
  599.  
  600.           .dc.b 'XBRA'
  601.           .dc.b 'DCST'
  602.           .dc.l 0
  603.  
  604. Start:    movem.l   d0-d5/a0-a4,-(sp)       ;register sichern           
  605.           clr.w     vblsem
  606.           bsr.s     ri_int
  607.           movem.l   (sp)+,d0-d5/a0-a4       ;register herstellen
  608.           move.b    #191,int_serv_reg_a     ;interrupt in service loeschen
  609.           ori.b     #96,int_enable_reg      ;ri und timer int freigeben
  610.           rte
  611.  
  612. * ACHTUNG: D2 = temporäres Register für bestimmte Rechnungen in ri_int
  613. *          A0 = temporärer Zeiger
  614. *          A1 = temporärer Zeiger
  615. *          A2 = temporärer Zeiger
  616. *          A4 = temporärer Zeiger
  617.  
  618. ri_int:   andi.b    #159,int_enable_reg     ;timer  und ri interrupt sperren
  619.           bchg      #6,aktive_edge_reg      ;naechster interrupt bei anderer flanke
  620.  
  621.           moveq.l    #255,d0                ;d0 = 255 - timerdat
  622.           sub.b     $fffa1f,d0              ;entspricht timerschritte seit letztem interrupt
  623.  
  624.           clr.w     d4
  625.           lea       parms,a4                ;a4 = ^parms        (bleibt so!)
  626.           lea       byte-parms(a4),a0       ;a0 = ^byte         (bleibt so!)
  627.           lea       bitcount-parms(a4),a1   ;a1 = ^bitcount     (bleibt so!)
  628.           lea       bytecount-parms(a4),a2  ;a2 = ^bytecount    (läuft hoch!)
  629.           move.w    (a2)+,d5                ;(bytecount)
  630.           move.l    (a2)+,a3                ;(adresse)
  631.           tst.w     (a2)                    ;(ri_flag) evtl TAS ???
  632.           bne.s     kein_sta_zei
  633.           move.w    #-1,status-parms(a4)
  634.  
  635. kein_sta_zei:       
  636.           move.w    #-1,(a2)+               ;(ri_flag)
  637.           move.b    d4,timercont            ;timer neu , d4 ist 0
  638.           addq.l    #1,a2
  639.           move.b    (a2)+,timerdat          ;starten (timerd1)
  640.           addq.l    #1,a2
  641.           move.b    (a2)+,timercont         ;(tim_dcont)
  642.           ori.b     #32,int_enable_reg
  643.           move.b    #223,int_serv_reg_a
  644.  
  645.           move.w    (a2),d3                 ;(vorher)
  646.           move.w    d0,(a2)+
  647.  
  648.           tst.w     (a2)+                   ;(synch_flag) wenn synchronisation noch nicht 
  649.           beq.s     loop                    ;erfolgte ist kein stuffing möglich
  650.  
  651.           move.w    (a2)+,d2                ;(synchwert)
  652.  
  653.           tst.w     d5                      ;sind bereits bytes empfangen worden
  654.           bne.s     evtl_endsynch           ;muss ein impuls > 7;32-16 ein endsynch sein
  655.  
  656.           cmp.w     d2,d0                   ;(synchwert)
  657.           bge.s     ri_ruecksprung
  658.           cmp.w     d2,d3                   ;(synchwert)
  659.           bge.s     ri_ruecksprung
  660.           bra.s     kein_7E
  661.  
  662. frame_end addq.l    #2,a1                   ;(a1 = ^sichadr)
  663.           move.l    (a1),a2                 ;(sichadr)
  664.           move.w    d5,d3                   ;anzahl der empfangenen bytes sichern
  665.           move.b    d3,(a2)+
  666.           lsr.w     #8,d3
  667.           move.b    d3,(a2)
  668.           clr.w     d5                      ;bytecount = 0
  669.           move.l    a3,(a1)                 ;(sichadr)
  670.           addq.l    #2,a3
  671.           clr.w     (a1)                    ;(bitcount)
  672.           clr.w     synch_flag-parms(a4)
  673.           subq.l    #2,a1                   ;(a1 = ^bitcount)
  674.  
  675. ri_ruecksprung:
  676.           lea       bytecount-parms(a4),a2
  677.           move.w    d5,(a2)+                ;(bytecount)
  678.           move.l    a3,(a2)                 ;(adresse)
  679.           rts                               ;ruecksprung
  680.  
  681. evtl_endsynch:      
  682.           cmp.w     d2,d3                   ;(synchwert)
  683.           bge.s     frame_end
  684.  
  685. kein_7E:  move.w    d3,d0
  686.  
  687. loop:     move.l    a0,a2                   ;a2 steht auf ^byte
  688.           move.w    (a2)+,d1                ;(byte) bis jetzt empf byte nach d1
  689.           sub.w     (a2)+,d0                ;(bitwert) timerschritte minus bitwert
  690.  
  691.           cmp.w     (a2),d0                 ;(vglwert) wenn rest > 16
  692.           ble.s     null_setzten
  693.  
  694.           bset      #7,d1                   ;war empf bit eine 1
  695.           addq.w    #1,d4
  696.           bra.s     vergleich
  697.  
  698. null_setzten:                               * sonst war es eine null
  699.           bclr      #7,d1
  700.           cmpi.w    #5,d4
  701.           bne.s     mach_null
  702.           clr.w     d4
  703.           bra.s     nix_schiebens
  704.  
  705. mach_null clr.w     d4
  706.  
  707. vergleich lea       synch_flag-parms(a4),a2 ;a2 = ^synch_flag
  708.           tst.w     (a2)                    ;(synch_flag) wenn synchbyte schon empf
  709.           bne.s     aufnahme                ;dann springe zu aufnahme
  710.  
  711.           cmpi.w    #$7e,d1                 ;wenn byte in d1 = 7e = synchronbyte
  712.           bne.s     schieben
  713.  
  714.           move.w    #$ff,(a2)               ;(synch_flag) synchronflag setzten
  715.           clr.w     (a0)                    ;(byte)
  716.           clr.w     (a1)                    ;(bitcount)
  717.           clr.w     d4
  718.           bra.s     nix_schiebens
  719.  
  720. aufnahme: cmpi.w    #7,(a1)                 ;(bitcount)
  721.           bne.s     schieben
  722.  
  723.           move.b    d1,(a3)+                ;byte in adresse schreiben und adresse um eins erhöhen
  724.           clr.w     (a1)                    ;(bitcount) bitcount =0
  725.           clr.w     (a0)                    ;(byte)
  726.           addq.w    #1,d5                   ;bytecount erhöhen
  727.           bra.s     nix_schiebens
  728.  
  729. schieben  lsr.b     #1,d1                   ;byte um 1 stelle nach rechts schiebne
  730.           move.w    d1,(a0)                 ;(byte)
  731.           addq.w    #1,(a1)                 ;(bitcount)
  732.  
  733. nix_schiebens:      
  734.           cmp.w     vglwert-parms(a4),d0    ;wenn wert in d0 >16
  735.           ble.s     ri_ruecksprung
  736.           bra.s     loop                    ;dann zu neuem durchlauf
  737.  
  738.             .bss
  739.       
  740. parms:              * REIHENFOLGE DER ADRESSEN NICHT VERÄNDERN!!!!!!!!!
  741. timer_ve:   .ds.l 1
  742. oldkey:     .ds.l 1
  743. savestack:  .dS.l 1
  744. byteflag:   .ds.w 1
  745.  
  746. bytecount:  .ds.w 1
  747. adresse:    .ds.l 1
  748. ri_flag:    .ds.w 1
  749. timerd1:    .ds.w 1
  750. tim_dcont:  .ds.w 1
  751. vorher:     .ds.w 1
  752. synch_flag: .ds.w 1
  753. synchwert:  .ds.w 1
  754. byte:       .ds.w 1
  755. bitwert:    .ds.w 1
  756. vglwert:    .ds.w 1
  757.  
  758. bitcount:   .ds.w 1
  759. sichadr:    .ds.l 1
  760. status:     .ds.w 1
  761.  
  762. lastparm:   .ds.w 1
  763.  
  764.             .end
  765.  
  766.  
  767. { Dies ist ein kleines Testprogramm zum Einbinden der Interruptroutinen }
  768. { DL8HBS 12/08/93                                                       }
  769.  
  770. { Stack auf 20 kByte begrenzen... }
  771. {$S20}
  772. program tfstx_test;
  773.  
  774. procedure ikbdws(cnt:integer;var s:string);
  775. xbios(25);
  776.  
  777. procedure maus_ein;
  778. var maus_eins : string;
  779. begin
  780.     maus_eins[0] := chr($08);
  781.     Ikbdws(0,maus_eins);
  782. end;
  783.  
  784. procedure maus_aus;
  785. var maus_eins : string;
  786. begin
  787.     maus_eins[0] := chr($12);
  788.     Ikbdws(0,maus_eins);
  789. end;
  790.  
  791. procedure main;
  792. var puffer,retadr:long_integer;
  793.     ch  : char;
  794.     db : boolean;
  795.     x   : integer;
  796.     procedure rsconf(speed,flowctl,ucr,rsr,tsr,scr:integer);
  797.     xbios(15);
  798.     procedure jenabint(nr:integer);
  799.     xbios(27);
  800.     procedure jdisint(nr:integer);
  801.     xbios(26);
  802.     function malloc(size:long_integer):long_integer;
  803.     gemdos($48);
  804.     procedure mfree(adress:long_integer);
  805.     gemdos($49);
  806.     
  807.     function wpeek(adress:long_integer):long_integer;
  808.     external;
  809.     function AX_RX_ON(puffer:long_integer):long_integer;
  810.     external;
  811.     procedure AX_RX_OFF;
  812.     external;
  813.  
  814. begin
  815.     puffer  := malloc(20000);
  816.     if puffer > 0 then begin
  817.         Rsconf(7,0,0,-1,1,0);
  818.         retadr  := AX_RX_ON(puffer);
  819.         maus_aus;
  820.         Jenabint(14);
  821.         repeat
  822.             read(ch);
  823.             if ch = 's' then begin
  824.                 for x := 0 to 24 do write(wpeek(retadr+x*2),' ');
  825.                 writeln;
  826.             end;
  827.         until ch = 'q';
  828.         Jdisint(14);
  829.         Jdisint(13);
  830.         AX_RX_OFF;
  831.         mfree(puffer);
  832.         maus_ein;
  833.     end;
  834. end;
  835.  
  836. begin
  837.     main;
  838. end.
  839.  
  840.  
  841. 20Aug93/1124 Subject: tfstx-source (modified) Bulletin ID: 38852_PI8DRE
  842. Path: DB0RBS!DK0MTV!DB0LJ!DB0SGL!DK0MWX!PI8AIR!PI8DRE
  843. From: PA3FUL@PI8DRE.NLD.EU To  : ATARI@ALLE           Hallo Atarianer,
  844. Habe in der Source von tfstx, 12/8/93 eingespielt von Joachim, DL8HBS,
  845. herumgewühlt und der Assembler gibt nun keine Fehlermeldungen mehr.
  846. Weiter habe ich die Source kontrolliert, speziell die
  847. Byte-Zugriffe auf die Register der MFP. Auch habe ich das Programm noch
  848. etwas weiter optimiert und "position-independent" gemacht.
  849. Die Routinen sind nicht geändert. Ich weiß zu wenig von der Sache um
  850. das erfolgreich zu tun. Es scheint mir, daß das Programm wartet auf ein
  851. $7E, das SynchronByte, dann Daten synchron empfangt und weitergibt,
  852. bis ein weiteres Synchronbyte detektiert wird.
  853. Ich habe kein Pascal compiler oder HS-MODEM, so ich kann das Programm
  854. nicht testen.
  855. Ich würde mich freuen wenn jemand etwas mit dieser modifizierte
  856. Source machen kann.
  857. 73 de Piet, PA3FUL @ PI8DRE.NLD
  858. * Dies ist eine bereits hochoptimierte Version von DH5MBC's Sourcen,
  859. * die Optimierungen sind von DL8HBS. Leider sind sie noch nicht ganz
  860. * fehlerfrei.
  861. * Ich würde diese Version überarbeiten und insbesondere die Variablen-
  862. * zugriffe nocheinmal genauestens überprüfen sowie die Verwendung von
  863. * Byte-Zugriffen auf die I/O-Adressen anstelle der originalen Word-
  864. * Zugriffe. Mit geladenem HSMODEM sollte die Interruptbearbeitung
  865. * dieser Version so schnell sein, dass sich Maus, Tastatur und
  866. * serielle Schnittstelle nicht gegenseitig aus'interrupten'.
  867. * Jegliche kommerzielle Verwertung ist untersagt, hieraus hervorge-
  868. * gangene verbesserte Sourcen MÜSSEN der Allgemeinheit zur Verfügung
  869. * gestellt werden.
  870. * Joachim Schurig, DL8HBS, 12/08/93
  871. *
  872. * Meine Kommentare sind in Englisch. Es ist also einfach zu sehen was ich
  873. * hinzugefuegt habe. Habe das Programm noch etwas optimiert durch
  874. * die Verwendung von Offsets (O_) zu Addressregisters. Dazu musste ich in
  875. * der RECEIVE ON-Routine a2 verwenden statt a4; a5 ist auf den? Stack 
  876. * gerettet worden und wieder restauriert.
  877. * Hoffentlich gibt das alles keine Probleme.
  878. * Ich habe kein Pascal-compiler, so ich kann nicht checken wieviel bugs
  879. * es noch gibt (hi). Die Routinen habe ich nicht geändert, habe nur einige 
  880. * deutliche Fehler behoben.
  881. * 73 de Piet, PA3FUL @ PI8DRE.NLD, 16-08-1993.
  882. *           .GLOBL AX_RX_ON,AX_RX_OFF   ; Empfang, restore ...
  883.  
  884. *          .XDEF stazei,timer_ve,timerd1,tim_dcont,taste
  885. *          .GLOBL scroll,Spuriosinterr
  886.  
  887. *
  888. * Registers MFP 68901
  889. *
  890. IERA                equ $fffa07   Interrupt enable register A
  891. ISRA                equ $fffa0f   Interrupt in-service register A
  892. AER                 equ $fffa03   Active edge register (1 l/h=on, 0 h/l=on)
  893. TADR                equ $fffa1f   Timer A Data register
  894. TACR                equ $fffa19   Timer A Control register
  895.  
  896. * inter_mask_reg    equ $00fffa15  Interrupt mask register B (NOT used)
  897.  
  898. *
  899. * Offset to Base of MFP $fffa00
  900. *
  901. mfp                 equ $fffa00
  902. *
  903. O_int_enable_reg    equ IERA-mfp
  904. O_int_serv_reg_a    equ ISRA-mfp
  905. O_aktive_edge_reg   equ AER-mfp
  906. O_timerdat          equ TADR-mfp
  907. O_timercont         equ TACR-mfp
  908.  
  909. *
  910. * System variables
  911. *
  912. vblsem              equ $0452     VBlank-handler (1=active)
  913. keyvec              equ $0118     handler IKBD/MIDI interrupt (MFP interr #6)
  914. rivec               equ $0138     Ring indicator (MFP interr #14)
  915. timer_a_vec         equ $0134     MFP interr #13 NOT supported by TOS in ST
  916. spurios_vec         equ $0060     Exception vector 24. Unknown interrupt
  917.  
  918. *
  919. *            .text
  920.  
  921. * a4 contains the relocated address of parms throughout the program
  922. * a4 will be loaded with this address after "trap's" (necessary?)
  923.  
  924. * a5 contains the base address of the mfp
  925.  
  926. * The code is position independent
  927.  
  928. *********************************************
  929. *                 RECEIVE ON                *
  930. *********************************************
  931.  
  932. * function AX_RX_ON(adresse:long_integer):long_integer; external;
  933.  
  934. AX_RX_ON: move.l    4(sp),d0                ;ADRESSE nach d0
  935.  
  936.           movem.l   d0-d7/a0-a6,-(sp)       ;register sichern
  937.  
  938.           lea.l     parms(pc),a4            reloc. startaddress of params
  939.           move.l    a4,a2
  940.           move.w    #O_lastparm/2,d1        clear table of params
  941. clr_lp:   clr.w     (a2)+                   lastparm not cleared!!
  942.           dbra      d1,clr_lp
  943.  
  944.           move.l    d0,O_sichadr(a4)        ;d0 = anfang empfangsspeicher
  945.           addq.l    #2,d0                   ;erste 2 bytes fuer zahl der empf.
  946.           move.l    d0,O_adresse(a4)        ;byte reserviert
  947.  
  948.           move.w    #255,O_timerd1(a4)      ;timer auf 1200 baud
  949.           move.w    #5,O_tim_dcont(a4)
  950.  
  951.           clr.l     -(sp)                   ;supervisor
  952.           move.w    #$20,-(sp)
  953.           trap      #1
  954.           addq.l    #6,sp
  955.  
  956.           lea       parms(pc),a4
  957.           move.l    d0,O_savestack(a4)      ;stackpointer retten
  958.             
  959.           lea       Neutast(pc),a2          ;tastaturinterrupt
  960.           move.l    keyvec,a3               ;XBRA
  961.           move.l    a3,-4(a2)
  962.  
  963.           move.l    a2,-(sp)
  964.           move.w    #06,-(sp)
  965.           move.w    #$d,-(sp)               ;neuen interruptvector Tastint                                      
  966.           trap      #14                     ;übergeben
  967.           addq.l    #8,sp
  968.           
  969.           lea       Start(pc),a2            ;XBRA ri
  970.           move.l    rivec,a3
  971.           move.l    a3,-4(a2)
  972.  
  973.           move.l    a2,-(sp)                relocated startaddress main loop
  974.           move.w    #14,-(sp)               interrupt #14 of mfp
  975.           move.w    #$d,-(sp)               set interrupt vector mfp
  976.           trap      #14                     Xbios
  977.           addq.l    #8,sp
  978.  
  979.           move.w    #14,-(sp)               ;ri interrupt noch sperren
  980.           move.w    #$1a,-(sp)              No interrupt from mfp
  981.           trap      #14                     Xbios
  982.           addq.l    #4,sp
  983.           
  984.           lea       TimerAint(pc),a2
  985.           lea       parms(pc),a4
  986.           move.l    a2,O_timer_ve(a4)
  987.           movea.l   timer_a_vec,a3          save old interr vector #13 (not
  988.           move.l    a3,-4(a2)               supported by TOS in ST)
  989.           move.l    a2,-(sp)                pointer interrupt routine
  990.           move.w    #255,-(sp)              ;1200  baud
  991.           move.w    #0,-(sp)                ;noch nicht starten
  992.           move.w    #0,-(sp)                ;timer A (0=timerA)
  993.           move.w    #$1f,-(sp)              Set timer
  994.           trap      #14
  995.           lea       12(sp),sp
  996.  
  997.           lea       Spuriosinterr(pc),a2    ;spurios interrupt verbiegen
  998.           movea.l   spurios_vec,a3
  999.           move.l    a3,-4(a2)
  1000.           move.l    a2,spurios_vec
  1001.  
  1002.           move.l    savestack,-(sp)         ;supervisor aus
  1003.           move.w    #$20,-(sp)
  1004.           trap      #1
  1005.           addq.l    #6,sp
  1006.  
  1007.           lea       parms(pc),a4            startaddress params
  1008.           move.w    #15,O_vglwert(a4)       ;anfangsparameter setzen
  1009.           move.w    #32,O_bitwert(a4)
  1010.           move.w    #208,O_synchwert(a4)
  1011.           clr.w     O_ri_flag(a4)
  1012.           clr.w     O_synch_flag(a4)
  1013.  
  1014.           movem.l   (sp)+,d0-d7/a0-a6       ;register restaurieren
  1015.           lea.l     byteflag(pc),a0         OK with Pascal??
  1016.           move.l    a0,d0          
  1017.  
  1018. *          movea.l   d0,a0                  ;rueckgabe ist adresse und turbo-c will
  1019. *          rts                              ;das in a0
  1020.  
  1021. * Nun, so sieht das in Pascal aus:
  1022.           move.l    (sp)+,a0
  1023.           addq.l    #4,sp
  1024.           jmp       (a0)
  1025.    
  1026. * procedure AX_RX_OFF;external;
  1027.  
  1028. *********************************************
  1029. *                 RECEIVE OFF               *
  1030. *********************************************
  1031.  
  1032. AX_RX_OFF equ *
  1033.           movem.l   d0-d7/a0-a6,-(sp)       ;register sichern
  1034.           clr.l     -(sp)                   ;supervisor
  1035.           move.w    #$20,-(sp)
  1036.           trap      #1
  1037.           addq.l    #6,sp
  1038.  
  1039.           lea       Start(pc),a0            ;ri zeiger zuruecksetzen
  1040.           move.l    -4(a0),rivec
  1041.  
  1042.           lea       TimerAint(pc),a0        ;ti zeiger zuruecksetzen
  1043.           move.l    -4(a0),timer_a_vec
  1044.  
  1045.           lea.l     Spuriosinterr(pc),a0    ;sp_int zeiger zuruecksetzen
  1046.           move.l    -4(a0),spurios_vec
  1047.  
  1048.           lea.l     Neutast(pc),a0          ;tastatur zeiger zuruecksetzen
  1049.           move.l    -4(a0),keyvec
  1050.  
  1051.           lea       parms(pc),a4
  1052.           move.l    O_savestack(a4),-(sp)   ;supervisor aus
  1053.           move.w    #$20,-(sp)
  1054.           trap      #1
  1055.           addq.l    #6,sp
  1056.  
  1057.           movem.l   (sp)+,d0-d7/a0-a6       ;register herstellen
  1058.           rts
  1059.  
  1060. * scroll equ *
  1061. *         tst.w     d0
  1062. *         beq.s     scrollret
  1063. *         move.l    a0,a1
  1064. *         add.l     #84,a1
  1065. * scrolloop equ *
  1066. *         move.l    (a1)+,(a0)+
  1067. *         dbf       d0,scrolloop
  1068. * scrollret equ *
  1069. *         rts
  1070.  
  1071. XBRAta:   dc.b 'XBRA'
  1072.           dc.b 'DCST'
  1073.           dc.l 0
  1074.  
  1075. Neutast:  ori.w     #$0700,sr               ;interruptlevel auf 5 setzen
  1076.           andi.w    #$f5ff,sr               ;somit ri_interrupt waehrend
  1077.           move.l    Neutast-4(pc),-(sp)     ;tastaturinterrupt moeglich
  1078.           rts
  1079.  
  1080.           dc.b 'XBRA'
  1081.           dc.b 'DCST'
  1082.           dc.l 0
  1083.  
  1084. Spuriosinterr equ *
  1085.           bra.s TimerAint
  1086.  
  1087.           dc.b 'XBRA'
  1088.           dc.b 'DCST'
  1089.           dc.l 0
  1090.  
  1091. TimerAint equ *                             ;Timer A ist abgelaufen...
  1092.           movem.l   d0-d5/a0-a5,-(sp)       ;register sichern, auch a5!
  1093.           bsr.s     ri_int                  ;a4 wird in ri_int geladen ??
  1094. *
  1095. * (a4)= relocated address of parms. (a5)= address of mfp
  1096. *
  1097.           clr.w     -(a2)                   ;(bytecount)
  1098.           addq.l    #2,a1                   ;a1 = ^sichadr;
  1099.           move.l    (a1)+,d2                ;(sichadr)
  1100.           addq.l    #2,d2
  1101.           move.l    d2,(a2)+                ;(adresse)
  1102.           clr.w     (a2)+                   ;(ri_flag)
  1103.           move.w    #-1,(a1)                ;(status)
  1104.           move.w    #1,vblsem
  1105.           clr.w     O_synch_flag(a4)        
  1106.           clr.b     O_timercont(a5)         ;timer neu. Stop timer
  1107.           addq.l    #1,a2
  1108.           move.b    (a2)+,O_timerdat(a5)    ;(timerd1) einstellen
  1109.           move.b    #159,O_int_serv_reg_a(a5) ;timer u. ri interrupt ist beendet 
  1110.           movem.l   (sp)+,d0-d5/a0-a5       ;register herstellen 
  1111.           ori.b     #96,IERA                ;timer u. ri int freigeben
  1112.           rte                               after restoring registers
  1113.  
  1114.           dc.b 'XBRA'
  1115.           dc.b 'DCST'
  1116.           dc.l 0
  1117.  
  1118. ***********************************************
  1119. *                 MAIN LOOP                   *
  1120. ***********************************************
  1121.  
  1122. Start:    movem.l   d0-d5/a0-a5,-(sp)       ;register sichern           
  1123.           clr.w     vblsem                  vblsem inactive
  1124.           bsr.s     ri_int
  1125.           move.b    #191,O_int_serv_reg_a(a5) ;interrupt in service loeschen
  1126.           movem.l   (sp)+,d0-d5/a0-a5       ;register herstellen
  1127.           ori.b     #96,IERA                ;ri und timer int freigeben
  1128.           rte                               AFTER restoring registers
  1129.  
  1130. * ACHTUNG: D2 = temporäres Register für bestimmte Rechnungen in ri_int
  1131. *          A0 = temporärer Zeiger
  1132. *          A1 = temporärer Zeiger
  1133. *          A2 = temporärer Zeiger
  1134. *          A4 = temporärer Zeiger
  1135. *          A5 = temporärer Zeiger (Baseaddress mfp)
  1136.  
  1137. ri_int    move.l    #mfp,a5
  1138.           andi.b    #159,O_int_enable_reg(a5) ;timer  und ri interrupt sperren
  1139.           bchg.b    #6,O_aktive_edge_reg(a5) ;naechster interrupt bei anderer flanke
  1140.  
  1141.           move.w    #255,d0                 ;d0 = 255 - timerdat. moveq not allowed
  1142.           sub.b     O_timerdat(a5),d0       ;entspricht timerschritte seit letztem interrupt
  1143.  
  1144.           clr.w     d4
  1145.           lea       parms(pc),a4            ;a4 = ^parms        (bleibt so!)
  1146.           lea       O_byte(a4),a0           ;a0 = ^byte         (bleibt so!)
  1147.           lea       O_bitcount(a4),a1       ;a1 = ^bitcount     (bleibt so!)
  1148.           lea       O_bytecount(a4),a2      ;a2 = ^bytecount    (läuft hoch!)
  1149.           move.w    (a2)+,d5                ;(bytecount)
  1150.           move.l    (a2)+,a3                ;(adresse)
  1151.           tst.w     (a2)                    ;(ri_flag) evtl TAS ???
  1152.           bne.s     kein_sta_zei
  1153.           move.w    #-1,O_status(a4)
  1154.  
  1155. kein_sta_zei equ *       
  1156.           move.w    #-1,(a2)+               ;(ri_flag)
  1157.           move.b    d4,O_timercont(a5)      ;timer neu , d4 ist 0
  1158.           addq.l    #1,a2
  1159.           move.b    (a2)+,O_timerdat(a5)    ;starten (timerd1)
  1160.           addq.l    #1,a2
  1161.           move.b    (a2)+,O_timercont(a5)   ;(tim_dcont)
  1162.           ori.b     #32,O_int_enable_reg(a5)
  1163.           move.b    #223,O_int_serv_reg_a(a5)
  1164.  
  1165.           move.w    (a2),d3                 ;(vorher)
  1166.           move.w    d0,(a2)+
  1167.  
  1168.           tst.w     (a2)+                   ;(synch_flag) wenn synchronisation noch nicht 
  1169.           beq.s     loop                    ;erfolgte ist kein stuffing möglich
  1170.  
  1171.           move.w    (a2)+,d2                ;(synchwert)
  1172.  
  1173.           tst.w     d5                      ;sind bereits bytes empfangen worden
  1174.           bne.s     evtl_endsynch           ;muss ein impuls > 7;32-16 ein endsynch sein
  1175.  
  1176.           cmp.w     d2,d0                   ;(synchwert)
  1177.           bge.s     ri_ruecksprung
  1178.           cmp.w     d2,d3                   ;(synchwert)
  1179.           bge.s     ri_ruecksprung
  1180.           bra.s     kein_7E
  1181.  
  1182. frame_end addq.l    #2,a1                   ;(a1 = ^sichadr)
  1183.           move.l    (a1),a2                 ;(sichadr)
  1184.           move.w    d5,d3                   ;anzahl der empfangenen bytes sichern
  1185.           move.b    d3,(a2)+
  1186.           lsr.w     #8,d3
  1187.           move.b    d3,(a2)
  1188.           clr.w     d5                      ;bytecount = 0
  1189.           move.l    a3,(a1)                 ;(sichadr)
  1190.           addq.l    #2,a3
  1191.           clr.w     (a1)                    ;(bitcount)
  1192.           clr.w     O_synch_flag(a4)
  1193.           subq.l    #2,a1                   ;(a1 = ^bitcount)
  1194.  
  1195. ri_ruecksprung equ *
  1196.           lea       O_bytecount(a4),a2
  1197.           move.w    d5,(a2)+                ;(bytecount)
  1198.           move.l    a3,(a2)                 ;(adresse)
  1199.           rts                               ;ruecksprung
  1200.  
  1201. evtl_endsynch equ *      
  1202.           cmp.w     d2,d3                   ;(synchwert)
  1203.           bge.s     frame_end
  1204.  
  1205. kein_7E:  move.w    d3,d0
  1206.  
  1207. loop:     move.l    a0,a2                   ;a2 steht auf ^byte
  1208.           move.w    (a2)+,d1                ;(byte) bis jetzt empf byte nach d1
  1209.           sub.w     (a2)+,d0                ;(bitwert) timerschritte minus bitwert
  1210.  
  1211.           cmp.w     (a2),d0                 ;(vglwert) wenn rest > 16
  1212.           ble.s     null_setzten
  1213.  
  1214.           bset      #7,d1                   ;war empf bit eine 1
  1215.           addq.w    #1,d4
  1216.           bra.s     vergleich
  1217.  
  1218. null_setzten equ *                          * sonst war es eine null
  1219.           bclr      #7,d1
  1220.           cmpi.w    #5,d4
  1221.           bne.s     mach_null
  1222.           clr.w     d4
  1223.           bra.s     nix_schiebens
  1224.  
  1225. mach_null clr.w     d4
  1226.  
  1227. vergleich lea       O_synch_flag(a4),a2     ;a2 = ^synch_flag
  1228.           tst.w     (a2)                    ;(synch_flag) wenn synchbyte schon empf
  1229.           bne.s     aufnahme                ;dann springe zu aufnahme
  1230.  
  1231.           cmpi.w    #$7e,d1                 ;wenn byte in d1 = 7e = synchronbyte
  1232.           bne.s     schieben
  1233.  
  1234.           move.w    #$ff,(a2)               ;(synch_flag) synchronflag setzten
  1235.           clr.w     (a0)                    ;(byte)
  1236.           clr.w     (a1)                    ;(bitcount)
  1237.           clr.w     d4
  1238.           bra.s     nix_schiebens
  1239.  
  1240. aufnahme: cmpi.w    #7,(a1)                 ;(bitcount)
  1241.           bne.s     schieben
  1242.  
  1243.           move.b    d1,(a3)+                ;byte in adresse schreiben und adresse um eins erhöhen
  1244.           clr.w     (a1)                    ;(bitcount) bitcount =0
  1245.           clr.w     (a0)                    ;(byte)
  1246.           addq.w    #1,d5                   ;bytecount erhöhen
  1247.           bra.s     nix_schiebens
  1248.  
  1249. schieben  lsr.b     #1,d1                   ;byte um 1 stelle nach rechts schiebne
  1250.           move.w    d1,(a0)                 ;(byte)
  1251.           addq.w    #1,(a1)                 ;(bitcount)
  1252.  
  1253. nix_schiebens equ *      
  1254.           cmp.w     O_vglwert(a4),d0        ;wenn wert in d0 >16
  1255.           ble.s     ri_ruecksprung
  1256.           bra.s     loop                    ;dann zu neuem durchlauf
  1257.  
  1258. *            .bss
  1259. *
  1260. *      
  1261. parms        equ *        * REIHENFOLGE DER ADRESSEN NICHT VERÄNDERN!!!!!!!!!
  1262. timer_ve:    ds.l 1
  1263. oldkey:      ds.l 1
  1264. savestack:   ds.l 1
  1265. byteflag:    ds.w 1
  1266.  
  1267. bytecount:   ds.w 1
  1268. adresse:     ds.l 1
  1269. ri_flag:     ds.w 1
  1270. timerd1:     ds.w 1
  1271. tim_dcont:   ds.w 1
  1272. vorher:      ds.w 1
  1273. synch_flag:  ds.w 1
  1274. synchwert:   ds.w 1
  1275. byte:        ds.w 1
  1276. bitwert:     ds.w 1
  1277. vglwert:     ds.w 1
  1278.  
  1279. bitcount:    ds.w 1
  1280. sichadr:     ds.l 1
  1281. status:      ds.w 1
  1282. lastparm     ds.w 1
  1283.  
  1284. *
  1285. * Offset params
  1286. *
  1287.  
  1288. O_timer_ve   equ timer_ve-parms
  1289. O_oldkey     equ oldkey-parms
  1290. O_savestack  equ savestack-parms
  1291. O_byteflag   equ byteflag-parms
  1292.  
  1293. O_bytecount  equ bytecount-parms
  1294. O_adresse    equ adresse-parms
  1295. O_ri_flag    equ ri_flag-parms
  1296. O_timerd1    equ timerd1-parms
  1297. O_tim_dcont  equ tim_dcont-parms
  1298. O_vorher     equ vorher-parms
  1299. O_synch_flag equ synch_flag-parms
  1300. O_synchwert  equ synchwert-parms
  1301. O_byte       equ byte-parms
  1302. O_bitwert    equ bitwert-parms
  1303. O_vglwert    equ vglwert-parms
  1304.  
  1305. O_bitcount   equ bitcount-parms
  1306. O_sichadr    equ sichadr-parms
  1307. O_status     equ status-parms
  1308. O_lastparm   equ lastparm-parms
  1309.  end
  1310.  
  1311. 27Sep93/1107  Subject: TFSTX...  Bulletin ID: 279301DB0SHG
  1312. Path: DB0RBS!DB0MWE!DB0LAN!DB0BOX!DB0HOF!DB0SON!DB0SIF!DB0GV!DB0LJ!DB0GE!DB0IZ!DK0MWX!DB0EAM!DK0MAV!DB0SHG
  1313. de DC7OS @ DB0SHG.NDS.DEU.EU to ATARI @ DL                 Moin, moin!
  1314. In den letzten Wochen habe ich mehr oder weniger unregelmäßig davon gelesen,
  1315. daß da ein paar Leute dransitzen TFSTX (also einen Treiber für das
  1316. BayCom-Modem am ST) zu schreiben.
  1317. Ich habe mir mal die Hardwarebeschreibung des Falcons etwas genauer angesehen
  1318. und dabei festgestellt, das der DSP da ja eigentlich auch PR machen könnte.
  1319. Vielleicht bedenkt der eine oder andere Programmentwickler dieses und
  1320. erstellt das TFSTX in 2 Teilen. Ein Teil für die softwaremäßige Steuerung,
  1321. ein anderer Teil mit dem hardwareabhängigem Teil. Dieser sollte dann z.B.
  1322. leicht austauschbar sein, um wahlweise ein BayCom-Modem an der seriellen
  1323. Schnittstelle oder den DSP als Modem zu betreiben.
  1324. Das waren nun nur mal so ein paar Gedanken dazu. Vielleicht greift die ja wer
  1325. auf.
  1326. 73!          Karsten, DC7OS @DB0SHG.DEU.EU    in Garbsen (JO42TK)
  1327.  
  1328.